package functional.closure;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

/**
 * @ClassName Closure9
 * @PackageName functional.closure
 * @projectName myThread
 * @Description 
 * @Author games
 * @Date 2025/8/27 下午1:45
 * @Version 1.0
 */
public class Closure9 {

    /**
     * 因此，在创建闭包并返回之前，通常不建议重新赋值捕获变量。这样做可以确保闭包的行为符合预期，并避免潜在的逻辑错误和内存管理问题。
     * @return
     */

    Supplier<List<Integer>> makeFun() {
        List<Integer> ai = new ArrayList<>();
        //ai = new ArrayList<>(); // Reassignment
        //return () -> ai;
        /**
         * 可以辩称在这种情况下不会发生变量捕获（Variable Capture）。但可以肯定的是，Closure3.java 的错误消息是专门针对局部变量的。
         * 因此，规则并非只是“在 Lambda 之外定义的任何变量必须是 final 的或等同 final 效果那么简单。相反，你必须考虑捕获的变量是否是等同 final 效果的。
         * 如果它是对象中的字段，那么它拥有独立的生存周期，并且不需要任何特殊的捕获，以便稍后在调用 Lambda 时存在。
         */
        return () -> new ArrayList<Integer>();
    }
}
